#include "batchreplacer.h"
#include <QFile>
#include <QTextStream>
#include <QDir>
#include <QThread>

BatchReplacer::BatchReplacer(QObject *parent) : QObject(parent)
{
}

void BatchReplacer::setParameters(const QString &rootDir,
                                 const QMap<QString, QString> &replaceRules,
                                 const QStringList &fileExtensions,
                                 const QStringList &excludeDirs)
{
    m_rootDir = rootDir;
    m_replaceRules = replaceRules; // 存储多组替换规则
    m_fileExtensions = fileExtensions;
    m_excludeDirs = excludeDirs;
}

void BatchReplacer::startReplace()
{
    // 收集所有待处理文件
    QStringList fileList;
    collectFiles(m_rootDir, fileList);
    int totalFiles = fileList.size();
    int filesProcessed = 0;
    int filesModified = 0;

    emit logMessage(QString("找到 %1 个待处理文件").arg(totalFiles));

    // 逐个处理文件
    for (const QString &filePath : fileList) {
        if (processFile(filePath)) {
            filesModified++;
        }
        filesProcessed++;
        emit progressUpdated(filesProcessed, totalFiles);
        QThread::msleep(10); // 短暂休眠，避免UI卡顿
    }

    emit replaceFinished(filesProcessed, filesModified);
}

void BatchReplacer::collectFiles(const QString &dirPath, QStringList &fileList)
{
    QDir dir(dirPath);
    if (!dir.exists()) return;

    // 获取目录下所有条目
    QFileInfoList entries = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
    for (const QFileInfo &entry : entries) {
        if (entry.isDir()) {
            // 跳过排除目录
            if (m_excludeDirs.contains(entry.fileName())) {
                continue;
            }
            // 递归遍历子目录
            collectFiles(entry.filePath(), fileList);
        } else if (entry.isFile()) {
            // 检查文件扩展名是否符合要求
            if (m_fileExtensions.isEmpty()) {
                // 无扩展名限制，全部加入
                fileList.append(entry.filePath());
            } else {
                // 只加入指定扩展名的文件（大小写不敏感）
                QString ext = entry.suffix().toLower();
                if (m_fileExtensions.contains(ext, Qt::CaseInsensitive)) {
                    fileList.append(entry.filePath());
                }
            }
        }
    }
}

bool BatchReplacer::processFile(const QString &filePath)
{
    // 读取文件内容
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        emit logMessage(QString("无法读取文件: %1").arg(filePath));
        return false;
    }
    QString content = file.readAll();
    file.close();

    // 应用所有替换规则（依次替换每组字符串）
    bool modified = false;
    QString originalContent = content;
    for (auto it = m_replaceRules.begin(); it != m_replaceRules.end(); ++it) {
        const QString &oldStr = it.key();    // 旧字符串
        const QString &newStr = it.value();  // 新字符串
        if (content.contains(oldStr)) {      // 大小写敏感的全匹配检查
            content.replace(oldStr, newStr); // 替换（大小写敏感）
            modified = true;
        }
    }

    // 如果内容有变化，写入文件
    if (modified) {
        if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
            emit logMessage(QString("无法写入文件: %1").arg(filePath));
            return false;
        }
        file.write(content.toUtf8());
        file.close();
        emit logMessage(QString("已修改: %1").arg(filePath));
        return true;
    }

    return false;
}
    